1.4.3 读取数量不定的输入数据
在前一节中,我们编写程序实现了1到10这10个整数求和。扩展此程序一个很自然的方向是实现对用户输入的一组数求和。在这种情况下,我们预先不知道要对多少个数求和,这就需要不断读取数据直至没有新的输入为止:
#include <iostream>
int main()
{
int sum = 0 value = 0;
// 读取数值知道遇到文件尾,计算所有读入的值的和
while (std::cin >> value)
sum += value; // 等价于 sum = sum + value
std::cout << "Sum is: " << sum << std::endl;
reutrn 0;
}
如果我们输入
3 4 5 6
则程序会输出
Sum is: 18
main的首行定义了两个名为sum和value的int变量,均初始化为0。我们使用value保存用户输入的每个数,数据读取操作是在while的循环条件中完成的:
while (std::cin >> value)
while循环条件的求值就是执行表达式
std::cin >> value
此表达式从标准输入读取下一个数,保存在value中。输入运算符(参见1.2节,第7页)返回其左侧运算对象,在本例中是std::cin。因此,此循环条件实际上检测的是std::cin。
当我们使用一个istream对象作为对象时,其效果是检测流的状态。如果流是有效的,即流未遇到错误,那么检测成功。当遇到文件结束符(end-of-file),或遇到一个无效输入时(例如读入的值不是一个整数),istream对象的状态会变为无效。处于无效状态的istream对象会使条件变为假。
因此,我们的while循环会一直执行直至遇到文件结束符(或输入错误)。while循环体使用复合赋值运算符将当前值加到sum上。一旦条件失败,while循环将会结束。我们将执行下一条语句,打印sum的值和一个endl。
从键盘键入文件结束符
当从键盘向程序输入数据时,对于如何指出文件结束,不同操作系统有不同的约定。在Windows系统中,出入文件结束符的方法是敲Ctrl+Z(按住Ctrl的同时按Z键),然后按Enter或Return键。在UXIX系统中,包括Mac OS X系统中,文件结束符输入是用Ctrl+D。
再探编译
编译器的一部分工作是寻求程序文本中的错误。编译器没有能力检查一个程序是否按照其作者的意图工作,单可以检查形式(form)上的错误。下面列出了一些最常见的编译器可以检查出的错误。
语法错误(syntax error):程序员犯了C++语言文法上的错误。下面程序展现了一些常见的语法错误;每条注释描述了下一行中语句存在的错误:
// 错误:main的参数列表漏掉了
int main ( {
// 错误:endl后使用了冒号而非分号
std::cout << "Read each file." << std::endl:
// 错误:字符串字面常量的两侧漏掉了引号
std::cout << Update master. << std::endl;
// 错误:漏掉了第二个输出运算符
std::cout << "Write new master" std::endl;
// 错误:return语句漏掉了分号
return 0
}
类型错误(type error):C++中每个数据项都有其类型。例如,10的类型是int(或者更通俗地说,“10是一个int型数据”)。单词"Hello",包括其两侧的双引号标记,则是一个字符串字面值常量。一个类型错误的例子是,向一个期望参数为int的函数传递了一个字符串字面值常量。
声明错误(declaration error):C++程序中的每个名字都要先声明后使用。名字声明失败通常会导致一条错误信息。两种常见的声明错误是:对来自标准库的名字忘记使用std::、标识符名字拼写错误:
#include <iostream>
int main()
{
int v1 = 0 v2 = 0;
std::cin >> v >> v2; // 错误:使用了"v"而非"v1"
// 错误:cout未定义;应该是std::cout
cout << v1 + v2 << std::endl;
return 0;
}
错误信息通常包含一个行号和一条简短描述,描述了编译器认为的我们所犯的错误。按照报告的顺序来逐个修正错误,是一种好习惯。因为一个单个错误常常会具有传递效应,导致编译器在其后报告比实际数量多得多的错误信息。另一个好习惯是每修正一个错误后就立即重新编译代码,或者最多是修正了一小部分的明显错误后就重新编译。这就是所谓的“编辑-编译-调试”(edit-compile-debug)周期。
普通的冒险故事提示您:看后求收藏(卧龙小说网http://www.wolongxs.com),接着再看更方便。
好书推荐:《我的剧本世界在自主运行》、《我是舰娘》、《交错世界之学院都市》、《认清现实后,她们开始追夫火葬场》、《好徒儿你就饶了为师伐》、《带着修真界仙子们天下无敌》、《剑来》、《修炼成仙的我只想养成女徒弟》、《足控勇者的目标是魔王的丝袜》、《被触手怪养大的少女》、